package com.ys.service.base.impl;

import com.alibaba.fastjson.JSON;
import com.ys.dto.AddDto;
import com.ys.entity.base.TbUserJobLevelManage;
import com.ys.entity.hr.TbJobLevel;
import com.ys.entity.hr.TbMedicalInsurance;
import com.ys.entity.hr.TbProvidentFund;
import com.ys.entity.hr.TbSocialSecurity;
import com.ys.entity.sys.YsCol;
import com.ys.mapper.base.TbUserJobLevelManageMapper;
import com.ys.mapper.hr.HrMapper;
import com.ys.service.base.TbUserJobLevelManageService;
import com.ys.util.CheckUtil;
import com.ys.vo.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;


/**
 * 员工职级管理
 */
@Service("tbUserJobLevelManageService")
public class TbUserJobLevelManageServiceImpl implements TbUserJobLevelManageService {
	private static final Logger logger = LoggerFactory.getLogger(TbUserJobLevelManageServiceImpl.class);

	@Autowired
	private TbUserJobLevelManageMapper tbUserJobLevelManageMapper;

	@Autowired
	private CheckUtil checkUtil;

	@Autowired
	private HrMapper hrMapper;

	/**
	 * 保存
	 */
	@Override
	public R save(Map<String, Object> params, Long menuId,boolean isAdd) throws Exception {
		logger.info("员工职级管理保存传参："+params);

		//参数验证
		String errorMsg = checkParams(params,menuId);
		if(errorMsg!=null && !"".equals(errorMsg)){
			return R.error(errorMsg);
		}

		TbUserJobLevelManage tbUserJobLevelManage = JSON.parseObject(JSON.toJSONString(params), TbUserJobLevelManage.class);
		//定薪标准/月
		BigDecimal fixsalaryStandard = BigDecimal.ZERO;
		//计算：年终奖/年 = 发薪标准/月*年终奖标准（月）
		if(tbUserJobLevelManage.getRoleLevelId()!=null && !"".equals(tbUserJobLevelManage.getRoleLevelId())){
			TbJobLevel tbJobLevel = new TbJobLevel().setId(tbUserJobLevelManage.getRoleLevelId()).queryFirst();
			if(tbJobLevel!=null){
				BigDecimal salaryStandard = tbJobLevel.getSalaryStandard();//发薪标准/月
				BigDecimal annualBonus = tbJobLevel.getAnnualBonus();//年终奖标准（月）
				fixsalaryStandard = tbJobLevel.getFixsalaryStandard();//定薪标准/月
				if(salaryStandard!=null && annualBonus!=null){
					tbUserJobLevelManage.setYearEndBonus(salaryStandard.multiply(annualBonus));
				}else {
					return R.error("该岗位职级：发薪标准/月、年终奖标准（月）信息为空！");
				}
			}else {
				return R.error("岗位职级表信息为空！");
			}
		}else{
			return R.error("岗位职级表信息为空！");
		}


		//计算：全年人力成本 = （定薪标准/月+社保（单位）/月+医保（单位）/月+公积金（单位）/月+附加费用）*12+年终奖/年
		if(tbUserJobLevelManage.getSocialSecurityId()!=null
				&& tbUserJobLevelManage.getMedicalInsuranceId()!=null
				&& tbUserJobLevelManage.getAccumulationFundId()!=null){
			//根据id分别查询社保、医保、公积金信息
			TbSocialSecurity tbSocialSecurity = new TbSocialSecurity().setId(tbUserJobLevelManage.getSocialSecurityId()).queryFirst();
			TbMedicalInsurance tbMedicalInsurance = new TbMedicalInsurance().setId(tbUserJobLevelManage.getMedicalInsuranceId()).queryFirst();
			TbProvidentFund tbProvidentFund = new TbProvidentFund().setId(tbUserJobLevelManage.getAccumulationFundId()).queryFirst();
			if(tbSocialSecurity!=null && tbMedicalInsurance!=null && tbProvidentFund!=null){
				//社保（单位）/月 = 养老保险（单位）/月 + 失业保险（单位）/月 + 工伤保险（单位）/月
				BigDecimal socialSecurityByCompany = tbSocialSecurity.getPiUnitMonth().add(tbSocialSecurity.getUiUnitMonth()).add(tbSocialSecurity.getWiiUnitMonth());
				//医保（单位）/月 = 医疗保险（单位）/月+生育保险（单位）/月
				BigDecimal medicalInsuranceByCompany = tbMedicalInsurance.getMiUnitMoonth().add(tbMedicalInsurance.getMiUnitMonth());
				//公积金（单位）/月
				BigDecimal providentFundByCompany = tbProvidentFund.getPfUnitMonth();
				//附加费用
				BigDecimal additionalCost = tbUserJobLevelManage.getAdditionalCost()!=null?tbUserJobLevelManage.getAdditionalCost():BigDecimal.ZERO;
				//计算
				BigDecimal humanResourcesCost = (fixsalaryStandard.add(socialSecurityByCompany).add(medicalInsuranceByCompany).add(providentFundByCompany).add(additionalCost))
						.multiply(new BigDecimal("12")).add(tbUserJobLevelManage.getYearEndBonus());
				tbUserJobLevelManage.setHumanResourcesCost(humanResourcesCost);
			}else {
				return R.error("社保、医保、公积金信息为空！");
			}
		}else{
			return R.error("社保、医保、公积金信息为空！");
		}

		//保存
		if(isAdd){
			//tbUserJobLevelManage.setStatus(1);
			tbUserJobLevelManageMapper.insert(tbUserJobLevelManage);
			return R.ok(AddDto.gotoEdit("/web/base/tbUserJobLevelManage/toEdit?id=" + tbUserJobLevelManage.getId()));
		}else {
			tbUserJobLevelManageMapper.update(tbUserJobLevelManage);
			//修改钉钉id
			if(params.get("dingDingId")!=null && !"".equals(params.get("dingDingId"))){
				hrMapper.updateUserDingIdByUserId(tbUserJobLevelManage.getUserId(),params.get("dingDingId").toString());
			}
			return R.ok();
		}
	}




	/**
	 * 参数验证
	 */
	public String checkParams(Map<String, Object> params, Long menuId) throws Exception {
		//获取pc字段数据
		List<YsCol> listField = new YsCol()
				.where("A.MenuId = "+menuId)
				.setOrderby("A.SortNo ASC")
				.queryList();
		//验证必填字段的非空；其他字段的长度限制、类型
		String backMsg = checkUtil.checkTableColLengthAndDataType("TB_UserJobLevelManage",listField,params,ysColItem->ysColItem.getFormEditRequired()!=null && ysColItem.getFormEditRequired() == 1);
		//附加费用/月-非0时，附加费说明必填
		if(params.get("additionalCost")!=null && !"".equals(params.get("additionalCost"))){
			if(params.get("additionalCostExplain")==null || "".equals(params.get("additionalCostExplain"))){
				backMsg = "附加费说明为空！";
			}
		}
		return backMsg;
	}


}
